class V {
    int x = 11;
    
    int getX( ){
        System.out.println("V::getX aufgerufen; x="+x);
        return x;
    }
    
    void setX (int y ) {
        x = y;
        System.out.println("V::setX("+y+") aufgerufen");
    }
    
    void f(){
        System.out.println("V::f aufgerufen");
    }
    
    void g(){
        System.out.println("V::g aufgerufen");
    }
}

class W extends V {
    int x = 13;

    int getX( ){
        System.out.println("W::getX aufgerufen; x="+x);
        return x;
    }
    
    void setX (int y ) {
        x = y;
        System.out.println("W::setX("+y+") aufgerufen");
    }  
    
    void f(){
        System.out.println("W::f aufgerufen");
    }
    
    void h(){
        System.out.println("W::h aufgerufen");
    }
}

public class Aufgabe1 {

    public static void main(String[] args) {
        V v=new W();
        W w=new W();
        v.setX(15); //->W.setX
        v.x=22;     //->V.x
        
        // Stelle 1
        v.f();
        v.g();
        //v.h(); Typ V kennt die Methode nicht

        w.f();
        w.g();
        w.h();
        
        v.getX(); //=15 in V.x
        w.getX(); //default Wert 13

        V r = new V();
        //r.h(); Typ V kennt die Methode nicht
        //((W) r).f(); //V cannot be cast to W

        ((W) v).f(); //W.f
        ((V) w).f(); //W.f

        }
}
